'use strict'

/**
 * g 这里代表 generator，表示含有生成器函数。
 * 是一个中间件
 */

var sha1 = require('sha1');
// 消息接收，xml格式的，需要处理
var getRawBody = require('raw-body');
var Wechat = require('./wechat');
var util = require('./util');

module.exports = function (opts, handler){
    return function *(next){
        // console.log(this);
        // console.log(this.query);

        // 实例化的同时，就执行了get、update、save。
        var wechat = new Wechat(opts);

        // 微信公众号接入验证
        // var token = config.wechat.token;// 注意，这是配置的token，不是公众号传递过来的。
        var token = opts.token;// 注意，这是配置的token，不是公众号传递过来的。
        var nonce = this.query.nonce;
        var echostr = this.query.echostr;
        var timestamp = this.query.timestamp;
        var signature = this.query.signature;
        // console.log(signature);
        var signature2 = [token, nonce, timestamp].sort().join('');
        var sha1str = sha1(signature2);
        // console.log(sha1str);
        if (this.method === 'GET') {
            if (sha1str === signature) {
                this.body = echostr + '';
            } else {
                this.body = 'wrong ...'
            }
            // this.body = 'wrong ...';// 这样就已经自动响应出去了。
        } else if(this.method === 'POST') {
            if (sha1str !== signature) {
                this.body = 'wrong ...'
                return false;
            }

            // yield 暂停函数的执行
            var data = yield getRawBody(this.req, {
                length: this.length,
                limit: '1mb',
                encoding: this.charset
            });// data 是一个 buffer 的 xml 字符串。
            // console.log(data.toString());

            var content = util.parseXMLAsync(data);// 转为 json 对象
            // console.log(content);// from、to 等的值都是数组了，见图 xml2js后的json数据.png
            var message = util.formatMessage(content.xml);
            // console.log(message);

            // 这种固定的回复，不灵活，应该进行封装，参看 tpl.js 文件
            /*
            if (message.MsgType === 'event') {
                 if (message.Event === 'subscribe') {
                     var now_time = (new Date()).getTime();
                     this.status = 200;
                     this.type = 'application/xml';
                     this.body =  '<xml>'
                                 + '<ToUserName><![CDATA[' + message.FromUserName + ']]></ToUserName>'
                                 + '<FromUserName><![CDATA[' + message.ToUserName + ']]></FromUserName>'
                                 + '<CreateTime>' + now_time + '</CreateTime>'
                                 + '<MsgType><![CDATA[text]]></MsgType>'
                                 + '<Content><![CDATA[你好]]></Content>'
                                 + '</xml>';
                     return;
                 }
             }
             */

            // 定制自定义回复
            this.weixin = message;
            yield handler.call(this, next);
            wechat.reply.call(this);
        }
    }
};